package com.ruifu.proj.service;

import com.fhzncloud.cloud.common.core.util.R;
import com.fhzncloud.cloud.common.security.service.CloudUser;
import com.ruifu.common.po.PmPtMain;
import com.ruifu.common.vo.PageResultVO;
import com.ruifu.proj.dto.ptmain.*;
import com.ruifu.proj.vo.page.ProjPage;
import com.ruifu.proj.vo.page.ProjPageResultVO;
import com.ruifu.proj.vo.pmtasklog.PmTaskLogVO;
import com.ruifu.proj.vo.ptmain.PmPtMainAndDocVO;
import com.ruifu.proj.vo.ptmain.PmPtMainTaskVO;
import com.ruifu.proj.vo.ptmain.PmPtMainTemplateQueryVO;
import com.ruifu.proj.vo.ptmain.PmPtMainVO;

import java.util.List;

/**
 * @author nyr
 */
public interface PmPtMainService {

    /**
     * 联合查询
     *
     * @param pageNum
     * @param pageSize
     * @param pmPtMainQueryDTO
     * @param cloudUser
     * @return
     */
    PageResultVO findByQuery(int pageNum, int pageSize, PmPtMainQueryDTO pmPtMainQueryDTO, CloudUser cloudUser);

    /**
     * 根据单个id查询
     *
     * @param ptId
     * @return
     */
    PmPtMainVO findById(Long ptId);

    /**
     * 单个id删除
     *
     * @param ptId
     * @param cloudUser
     */
    void deleteById(Long ptId, CloudUser cloudUser);

    /**
     * 根据项目编号查询项目
     *
     * @param ptCode
     * @return
     */
    Boolean findByPtCode(String ptCode);

    /**
     * 根据父任务id查询子任务列表
     *
     * @param ptId
     * @return
     */
    List<PmPtMainVO> findByPtPId(Long ptId);

    /**
     * 新建项目
     *
     * @param pmPtMainInsertDTO
     * @param cloudUser
     */
    Long insert(PmPtMainInsertDTO pmPtMainInsertDTO, CloudUser cloudUser);

    /**
     * 新建游离态项目
     *  @param pmPtMainInsertDTO
     * @param cloudUser
     */
    void create(PmFreePtMainInsertDTO pmPtMainInsertDTO, CloudUser cloudUser);
    /**
     * 修改甘特图结构
     *
     * @param pmPtMainGTDTOList
     * @param cloudUser
     */
    void updateList(Long ptId,List<PmPtMainGTDTO> pmPtMainGTDTOList, CloudUser cloudUser);

    /**
     * 暂停、重启接口
     *
     * @param ptId
     * @param isPause
     * @param cloudUser
     */
    void updateRunning(Long ptId, Boolean isPause, CloudUser cloudUser);

    /**
     * 项目详情(含子任务)
     *
     * @param ptId
     * @return
     */
    List<PmPtMainVO> findAllByPtId(Long ptId,CloudUser cloudUser);

    /**
     * 修改指定经理人
     *
     * @param ptId
     * @param ptExecuter
     * @param cloudUser
     */
    void updateByExecuter(Long ptId, Long ptExecuter, CloudUser cloudUser);

    /**
     * 查询项目、任务的计划页
     * @param ptId
     * @param cloudUser
     * @return
     */
    ProjPageResultVO findPlanById(Integer pageNum, Integer pageSize, Long ptId, CloudUser cloudUser);

    /**
     * 保存计划版本
     * @param pmPtMainPlanDTO
     * @param cloudUser
     * @return
     */
    void savePlan( PmPtMainPlanDTO  pmPtMainPlanDTO, CloudUser cloudUser);

    /**
     * 任务属性
     * @param ptId
     * @return
     */
    PmPtMainAndDocVO findByTask(Long ptId, CloudUser cloudUser);

    /**
     * 保存任务属性
     *
     * @param pmPtMainAttributeDTO
     * @param cloudUser
     */
    void saveAttributeById(PmPtMainAttributeDTO pmPtMainAttributeDTO, CloudUser cloudUser);

    /**
     * 查询项目子任务
     * @param ptId
     * @return
     */
    List<PmPtMainTaskVO> findTaskByPtId(Long ptId);

    /**
     * 审核
     * @param pmPtMainAuditDTO
     * @param cloudUser
     */
    void updateAudit(PmPtMainAuditDTO pmPtMainAuditDTO, CloudUser cloudUser);

    /**
     * 查询模板页
     * @param pageNum 当前页码
     * @param pageSize 每页大小
     * @param pmPtMainTemplateQueryDTO 查询对象
     * @param cloudUser 用户对象
     * @return
     */
    PageResultVO findTemplateByQuery(int pageNum, int pageSize, PmPtMainTemplateQueryDTO pmPtMainTemplateQueryDTO, CloudUser cloudUser);

    /**
     * 查询任务日志
     * @param ptId
     * @return
     */
    List<PmTaskLogVO> findByLog(Long ptId);

    /**
     * 查询个人面板
     * @param pageNum
     * @param pageSize
     * @param pmPtMainPanelDTO
     * @param cloudUser
     * @return
     */
    PageResultVO findPanelByQuery(int pageNum, int pageSize, PmPtMainPanelDTO pmPtMainPanelDTO, CloudUser cloudUser);

    /**
     * 批量删除
     *
     * @param ptIds 模板id数组
     * @param cloudUser
     * @return
     */
    void deletePL(Long[] ptIds, CloudUser cloudUser);

    /**
     * 修改模板的状态
     *
     * @param ptId     模板id
     * @param ptStatus 模板要修改的状态 TA -> TB <-> TC
     * @param cloudUser
     * @return
     */
    void updateTemplateStatus(Long ptId, String ptStatus, CloudUser cloudUser);

    /**
     * 使用模板
     * @param ptId 模板id
     * @param cloudUser 用户对象
     * @return
     */
    void useTemplate(Long ptId, CloudUser cloudUser);

    /**
     * 查询所有模板列表
     *
     * @param ptName 模板名称
     * @param cloudUser
     * @return
     */
    List<PmPtMainTemplateQueryVO> findTemplateListByPtName(String ptName, CloudUser cloudUser);

    /**
     * 新建任务-个人面板
     * @param pmPtMainInsertTaskDTO
     * @param cloudUser
     */
    void insertTask(PmPtMainInsertTaskDTO pmPtMainInsertTaskDTO, CloudUser cloudUser);

    /**
     * 个人面板-选择父任务列表
     * @param pageNum
     * @param pageSize
     * @param ptName
     * @param cloudUser
     * @return
     */
    PageResultVO findParentByPtName(int pageNum, int pageSize, String ptName, CloudUser cloudUser);

    /**
     * 根据用户ID和任务ID，决定权限
     * @param cloudUser
     * @param ptId
     * @return
     */
    Integer findPermissionByUserIdAndPtId(Long cloudUser, Long ptId);

    /**
     * 一键重启
     * @param ptId 任务id
     * @param cloudUser 用户对象
     */
    void updateRestart(Long ptId, CloudUser cloudUser);

    /**
     * 撤销
     * @param ptId 任务id
     * @param cloudUser 用户对象
     */
    void revocationIssued(Long ptId, CloudUser cloudUser);

    /**
     * 撤销转交
     * @param ptId 任务Id
     * @param cloudUser 用户对象
     */
    void revocationDeliver(Long ptId, CloudUser cloudUser);

    /**
     * 下达
     * @param ptId
     * @param cloudUser
     */
    void issued(Long ptId, CloudUser cloudUser);

    /**
     * 启动
     * @param ptId
     * @param cloudUser
     */
    void start(Long ptId, CloudUser cloudUser);

    /**
     * 提交
     * @param ptId
     * @param cloudUser
     */
    void submit(Long ptId, CloudUser cloudUser);

    /**
     * 转交
     * @param ptId
     * @param ptExecuter
     * @param cloudUser
     */
    void careOf(Long ptId, Long ptExecuter, CloudUser cloudUser);

    /**
     * 获取项目/任务编号
     * @param ptPtm
     * @return
     */
    String getProjectCode(String ptPtm);

    /**
     * 获取模板项目编号
     * @return
     */
    String getTemplateCode();

    /**
     * 递归查询任务所属项目
     *
     * @param ptPId
     * @return
     */
    PmPtMain recursionProject(Long ptPId);

    /**
     * 查询当前任务可选的启停条件列表
     * @param pmPtId
     * @return
     */
    List<PmPtMainTaskVO> findCondTask(Long pmPtId);

    /**
     * 根据项目类型查询项目
     * @param pyId
     * @return
     */
    List<PmPtMain> findByPyId(Long pyId);

    /**
     * 批量下达任务
     * @param ptId
     * @param cloudUser
     * @return
     */
    R batchIssued(Long ptId, CloudUser cloudUser);

    R test(Long ptId, CloudUser cloudUser);

    String changeLevel(Long ptId,String state,CloudUser cloudUser);

    PageResultVO findTasksPage(Long ptId, int pageNum, int pageSize, CloudUser cloudUser);

    void saveAll(SavePmPtMainAttributeDTO savePmPtMainAttributeDTO,CloudUser cloudUser);

    void insertAll(CreateNewPmPtMainDTO createNewPmPtMainDTO,CloudUser cloudUser);

    ProjPage findAllTasks(ProjPage page, Long ptId, CloudUser cloudUser);

    PmTaskAuditDTO findTaskAuditByPtId(Long ptId,Long paId, CloudUser cloudUser);

    void exchange(Integer sourceId, Integer targetId, String type,CloudUser cloudUser);

    void submitPlan(Long pvId);

    void editPlan(PmPlanVerDTO pmPlanVerDTO, CloudUser cloudUser);

    void rejectPlan(Long pvId);
}
